%pylab
a = arange(6)
a
将形状修改为2乘3:
a.shape = 2,3
a
与之对应的方法是 reshape
,但它不会修改原来数组的值,而是返回一个新的数组:
a.reshape(3,2)
a
shape
和 reshape
方法不能改变数组中元素的总数,否则会报错:
a.reshape(4,2)
a = arange(3)
shape(a)
y = a[newaxis, :]
shape(y)
根据插入位置的不同,可以返回不同形状的数组:
y = a[:, newaxis]
shape(y)
插入多个新维度:
y = a[newaxis, newaxis, :]
shape(y)
a = arange(6)
a.shape = (2,1,3)
b = a.squeeze()
b.shape
squeeze 返回一个将所有长度为1的维度去除的新数组。
使用 transpose
返回数组的转置,本质上是将所有维度反过来:
a
对于二维数组,这相当于交换行和列:
a.transpose()
或者使用缩写属性:
a.T
注意:
a = arange(60)
a
a.shape = 3,4,5
a
b = a.T
b.shape
转置只是交换了轴的位置。
另一方面,转置返回的是对原数组的另一种view,所以改变转置会改变原来数组的值。
a = arange(6)
a.shape = (2,3)
a
修改转置:
b = a.T
b[0,1] = 30
原数组的值也改变:
a
有时我们需要将不同的数组按照一定的顺序连接起来:
concatenate((a0,a1,...,aN), axis=0)
注意,这些数组要用 ()
包括到一个元组中去。
除了给定的轴外,这些数组其他轴的长度必须是一样的。
x = array([
[0,1,2],
[10,11,12]
])
y = array([
[50,51,52],
[60,61,62]
])
print x.shape
print y.shape
默认沿着第一维进行连接:
z = concatenate((x,y))
z
z.shape
沿着第二维进行连接:
z = concatenate((x,y), axis=1)
z
z.shape
注意到这里 x
和 y
的形状是一样的,还可以将它们连接成三维的数组,但是 concatenate
不能提供这样的功能,不过可以这样:
z = array((x,y))
z.shape
事实上,Numpy提供了分别对应这三种情况的函数:
vstack((x, y)).shape
hstack((x, y)).shape
dstack((x, y)).shape
flatten
方法的作用是将多维数组转化为1维数组:
a = array([[0,1],
[2,3]])
b = a.flatten()
b
返回的是数组的复制,因此,改变 b
并不会影响 a
的值:
b[0] = 10
print b
print a
还可以使用数组自带的 flat
属性:
a.flat
a.flat
相当于返回了所有元组组成的一个迭代器:
b = a.flat
b[0]
但此时修改 b
的值会影响 a
:
b[0] = 10
print a
a.flat[:]
除此之外,还可以使用 ravel
方法,ravel
使用高效的表示方式:
a = array([[0,1],
[2,3]])
b = a.ravel()
b
修改 b
会改变 a
:
b[0] = 10
a
但另一种情况下:
a = array([[0,1],
[2,3]])
aa = a.transpose()
b = aa.ravel()
b
b[0] = 10
aa
a
可以看到,在这种情况下,修改 b
并不会改变 aa
的值,原因是我们用来 ravel
的对象 aa
本身是 a
的一个view。
保证数组至少有 x
维:
x = 1
atleast_1d(x)
a = array([1,2,3])
b = atleast_2d(a)
b.shape
b
c = atleast_3d(b)
c.shape
x
可以取值 1,2,3。
在Scipy库中,这些函数被用来保证输入满足一定的条件:“
用法 | Scipy中出现次数 |
---|---|
value.flaten() value.flat value.ravel() |
~2000次 |
atleast_1d(value) atleast_2d(value) |
~700次 |
asarray(value) | ~4000次 |